package com.bjdd.jdy.baidu;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.widget.Toast;

import com.baidu.trace.LBSTraceClient;
import com.baidu.trace.Trace;
import com.baidu.trace.api.entity.OnEntityListener;
import com.baidu.trace.model.LocationMode;
import com.baidu.trace.model.OnTraceListener;
import com.baidu.trace.model.PushMessage;
import com.bjdd.jdy.Constant;
import com.bjdd.jdy.base.RxManager;
import com.bjdd.jdy.util.L;


public class MyService extends Service {

    private static final String TAG = "MyService";

    // 轨迹服务
    protected static Trace trace = null;

    // 鹰眼服务ID，开发者创建的鹰眼服务对应的服务ID
    public static final long serviceId = 138290;

    // 轨迹服务类型
    //0 : 不建立socket长连接，
    //1 : 建立socket长连接但不上传位置数据，
    //2 : 建立socket长连接并上传位置数据）
    private int traceType = 2;

    // 轨迹服务客户端
    public static LBSTraceClient client = null;

    // Entity监听器
    public static OnEntityListener entityListener = null;

   //轨迹服务监听器
    protected static OnTraceListener mTrackListener = null;

    // 采集周期（单位 : 秒）
    private int gatherInterval = 5;

    // 设置打包周期(单位 : 秒)
    private int packInterval = 10;

    protected static boolean isTraceStart = false;

    // 是否需要对象存储服务，默认为：false，关闭对象存储服务。注：鹰眼 Android SDK v3.0以上版本支持随轨迹上传图像等对象数据，若需使用此功能，该参数需设为 true，且需导入bos-android-sdk-1.0.2.jar。
    boolean isNeedObjectStorage = false;

    // 手机IMEI号设置为唯一轨迹标记号,只要该值唯一,就可以作为轨迹的标识号,使用相同的标识将导致轨迹混乱
    private String imei;


    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        L.d("---------------服务onStartCommand-------------------------");
        if (intent != null && intent.getExtras() != null) {
            imei = intent.getStringExtra("imei");
        }
        init();
        //订阅关闭事件
        RxManager rxManager = new RxManager();
        rxManager.on(Constant.CLOSE_TRACE,arg -> stopTrace());
        return super.onStartCommand(intent, Service.START_STICKY, startId);
    }

    //被销毁时反注册广播接收器
    public void onDestroy() {
        L.d("----------------------------服务onDestroy--------------------------------");
//        stopTrace();
        super.onDestroy();
    }


    private void init() {
        // 初始化轨迹服务客户端
        client = new LBSTraceClient(this);

        // 设置定位模式
        client.setLocationMode(LocationMode.High_Accuracy);

        // 初始化轨迹服务
        trace = new Trace(serviceId, imei,isNeedObjectStorage);

        // 采集周期,上传周期
        client.setInterval(gatherInterval, packInterval);

        // 设置http请求协议类型0:http,1:https
        //client.setProtocolType();

        // 初始化监听器
        initListener();

        // 启动轨迹上传
        startTrace();
    }

    // 开启轨迹服务
    private void startTrace() {
        // 通过轨迹服务客户端client开启轨迹服务
        client.startTrace(trace, mTrackListener);
        //开启轨迹采集，启动轨迹追踪
//        client.stopGather(mTrackListener);
    }

    // 停止轨迹服务
    public static void stopTrace() {
        // 通过轨迹服务客户端client停止轨迹服务
        L.d("-------------------------关闭服务-------------------"+isTraceStart);
        if (isTraceStart) {
            //client.stopTrace(trace,);
            client.stopTrace(trace,mTrackListener);
        }
    }

    // 初始化监听器
    private void initListener() {

        initOnEntityListener();
        initTraceListener();
    }

    private void initTraceListener(){
        mTrackListener = new OnTraceListener() {
            @Override
            public void onStartTraceCallback(int i, String s) {
                L.e("开启轨迹回调接口 [消息编码 : " + i + "，消息内容 : " + s + "]");
                if (0 == i || 10006 == i) {
                    isTraceStart = true;
                    client.startGather(mTrackListener);
                    L.d("开启轨迹成功");
                }
            }

            @Override
            public void onStopTraceCallback(int i, String s) {
                if (i == 0 || i == 11004){
                    L.i(TAG, "停止轨迹服务成功");
                    isTraceStart = false;
                    stopSelf();
                }else {
                    L.i(TAG, "停止轨迹服务接口消息 [错误编码 : " + i + "，消息内容 : " + s + "]");
                }
            }

            @Override
            public void onStartGatherCallback(int i, String s) {
                L.d("开启轨迹采集结果-------状态码："+i+"------消息："+s);
                if (i == 0 ){
                    L.d("开启轨迹查询成功");
                }
            }

            @Override
            public void onStopGatherCallback(int i, String s) {
                L.d("关闭轨迹采集结果-------状态码："+i+"------消息："+s);
                if (i == 0 || i == 13003){

                }
            }

            @Override
            public void onPushCallback(byte b, PushMessage pushMessage) {
                L.e("轨迹服务推送接口消息 [消息类型 : " + b + "，消息内容 : " + pushMessage + "]");
            }
        };
    }



    // 初始化OnEntityListener
    private void initOnEntityListener() {

    }
}
